package kgc.crm.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import kgc.crm.dto.SelectListMenuDto;
import kgc.crm.enums.MenuTypeEnum;
import kgc.crm.enums.UserStatusEnum;
import kgc.crm.enums.WhereEnum;
import kgc.crm.mapper.MenuMapper;
import kgc.crm.mapper.UserRoleMapper;
import kgc.crm.model.Menu;
import kgc.crm.service.IMenuService;
import kgc.crm.util.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
@Slf4j
public class MenuServiceImpl implements IMenuService {
    @Autowired
    private MenuMapper menuMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
//获取权限菜单
    @Override
    public List<Menu> getMenuListByUserId(String apitoken) {
        Long id = JWTManager.getUserIDByToken(apitoken);
        return menuMapper.getMenuListByUserId(
                new SelectListMenuDto(id, MenuTypeEnum.INDEX, UserStatusEnum.BY_SUCCESS));
    }
    //根据id查询菜单
    @Override
    public ResponseEntity list(Integer id) {
        if (id == null || id < 0) {
            log.error("【菜单管理-菜单查询】查询失败，参数不能为空");
            return ResultUtil.error("查询失败");
        }
        //如果id等于0 那么就要查出crm的 根菜单
        if (id == 0) {
            QueryWrapper<Menu> wrapper = new QueryWrapper<>();
            wrapper.eq(Menu.COL_PARENT_ID,id)
                    .eq(Menu.COL_REALM, Constant.SYSTEM_NAME_CRM);
            Menu menu = menuMapper.selectOne(wrapper);
            id = menu.getMenuId();
            //之所以这样赋值，是要搞明白，传个o的话拿到的是什么东西，拿到的是系统
        }
        QueryWrapper<Menu> wrapper = new QueryWrapper<>();
        wrapper.eq(Menu.COL_PARENT_ID,id)
                .eq(Menu.COL_STATUS,UserStatusEnum.BY_SUCCESS)
                .orderByAsc(Menu.COL_SORT);
                //类型是目录 状态是正常
        if (id==0)
            wrapper.eq(Menu.COL_MENU_TYPE,MenuTypeEnum.INDEX);
        List <Menu> list  = menuMapper.selectList(wrapper);
        return ResultUtil.success(list);
    }

    @Override
    public ResponseEntity add(Menu menu) {
        if (EmptyChecker.isEmpty(menu)) {
            log.error("【菜单管理-菜单添加】添加失败，参数不能为空");
            return ResultUtil.error("添加失败");
        }
        if (!EmptyChecker.mybatisIsEmpty(menu)) {
            //如果是false的话，menu对象中的内容不能为空
            log.error("【菜单管理-菜单添加】Menu对象中的内容不能为空,{}",menu);
            return ResultUtil.error("添加失败");
        }
        int insert = -1;
        try {
            insert = menuMapper.insert(menu);
        } catch (Exception e) {
            log.error("【菜单管理-菜单添加】添加失败，sql语句执行失败,{}",e);
            return ResultUtil.error("添加失败");
        }
        if (insert <= 0) {
            log.error("【菜单管理-菜单添加】添加失败，sql语句执行失败,{}");
            return ResultUtil.error("添加失败");
        }
        return ResultUtil.success("添加成功");
    }

    @Override
    public ResponseEntity upd(Menu menu) {
        if (EmptyChecker.isEmpty(menu)) {
            log.error("【菜单管理-菜单修改】修改失败，参数不能为空");
            return ResultUtil.error("修改失败");
        }
        if (EmptyChecker.isEmpty(Menu.COL_MENU_ID)) {
            //如果是false的话，menu对象中的内容不能为空
            log.error("【菜单管理-菜单修改】ID不能为空,{}",menu);
            return ResultUtil.error("修改失败");
        }
        int insert = -1;
        try {
            insert = menuMapper.updateById(menu);
        } catch (Exception e) {
            log.error("【菜单管理-菜单修改】修改失败，sql语句执行失败,{}",e);
            return ResultUtil.error("修改失败");
        }
        if (insert <= 0) {
            log.error("【菜单管理-菜单修改】修改失败，sql语句执行失败,{}");
            return ResultUtil.error("修改失败");
        }
        return ResultUtil.success("修改成功");
    }

    @Override
    public ResponseEntity del(Menu menu) {
        if (EmptyChecker.isEmpty(menu)) {
            log.error("【菜单管理-删除菜单】删除失败，参数不能为空");
            return ResultUtil.error("删除失败");
        }
        if (EmptyChecker.isEmpty(Menu.COL_MENU_ID)) {
            //如果是false的话，menu对象中的内容不能为空
            log.error("【菜单管理-删除菜单】ID不能为空,{}",menu);
            return ResultUtil.error("删除失败");
        }
        int insert = -1;
        try {
            menu.setUserStatusEnum(UserStatusEnum.BY_DIS);
            insert = menuMapper.updateById(menu);
        } catch (Exception e) {
            log.error("【菜单管理-删除菜单】修改失败，sql语句执行失败,{}",e);
            return ResultUtil.error("删除失败");
        }
        if (insert <= 0) {
            log.error("【菜单管理-删除菜单】修改失败，sql语句执行失败,{}");
            return ResultUtil.error("删除失败");
        }
        return ResultUtil.success("删除成功");
    }

    @Override
    public ResponseEntity bathDel(String ids) {
        if (StringUtils.isBlank(ids)) {
            log.error("【菜单管理-删除菜单】删除失败，ids对象不能为空s");
            return ResultUtil.error("删除失败");
        }
        JSONObject object = JSON.parseObject(ids);
        JSONArray array = object.getJSONArray("ids");
      //  Object[] toArray = array.toArray();
        if (EmptyChecker.isEmpty(array)) {
            log.error("【菜单管理-删除菜单】删除失败，ids对象不能为空");
            return ResultUtil.error("删除失败");
        }
        //Menu menu = new Menu();
        //menu.setUserStatusEnum(UserStatusEnum.BY_DIS);
//        QueryWrapper<Menu> wrapper = new QueryWrapper<>();
//        wrapper.in(Menu.COL_MENU_ID,toArray);
        int update = -1;
        try {
            update = menuMapper.deleteBatchIds(array);
        } catch (Exception e) {
            log.error("【菜单管理-删除菜单】修改失败，sql语句执行失败,{}",e);
            return ResultUtil.error("删除失败");
        }
        if (update <= 0) {
            log.error("【菜单管理-删除菜单】修改失败，sql语句执行失败,{}");
            return ResultUtil.error("删除失败");
        }
        return ResultUtil.success("删除成功");
    }
}
